/**
 * Created With IntelliJ IDEA
 * Description:牛客网：OR57 手套
 * <a href="https://www.nowcoder.com/practice/365d5722fff640a0b6684391153e58d8?tpId=49&&tqId=29337&rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking">...</a>
 * User: DELL
 * Data: 2023-04-08
 * Time: 23:51
 */


/**
 * 解题思路：（当每一种颜色的左手或者右手手套个数均大于零的时候）
 * 主要思路就是让一只手的手套每个颜色的都至少拿一只，之后另一只手随便拿一个就至少可以配对出一双手套，
 * 即求出左手手套个数为 leftSum ，其中个数最少的为 leftMin ，之后要满足左手手套每个颜色的都至少
 * 有一个的条件，即最少需要拿 leftSum-leftMin+1 个左手手套，之后右手手套再拿 1 个即可，而对应
 * 的另一种情况就是拿 rightSum-rightMin+1 ，之后再拿左手手套一个即可。
 * 即最少需要拿的手套数为 min(leftSum-leftMin+1 , rightSum-rightMin+1) + 1
 * (但是当存在左手或者右手手套个数为零的时候上述结论就不成立了，因为我们在拿 leftSum-leftMin+1
 * 个左手手套的时候，无法保证我们拥有每一种颜色的左手手套，因此这种情况下我们需要特殊处理）
 * 主要的思路就是我们再统计上述的 leftSum rightSum leftMin rightMin 的时候，略过那些只有一只手
 * 有手套，而另一只手没有手套的颜色的手套，最后在计算的时候，把这些特殊手套的总数加上即可，即这样子处理
 * 的本质就是先忽略掉这些特殊的手套，将那些非特殊的手套组合成一组，算出其中符合情况下最少需要拿的手套数，
 * 之后再考虑这些特殊的手套，比如加入个绿色的手套，只有左手 m 个，因此我们左手多拿 m 个就可以忽略掉这个
 * 绿色手套的干扰，因此最后的总数加上这些所有的特殊手套数即可。
 */
public class Gloves {
    public int findMinimum(int n, int[] left, int[] right) {
        int leftSum = 0;
        int rightSum = 0;
        int leftMin = Integer.MAX_VALUE;
        int rightMin = Integer.MAX_VALUE;
        int sum = 0;  //记录特殊手套的数量
        for (int i = 0; i < n; i++) {
            if (left[i] * right[i] == 0) {
                sum += (left[i] + right[i]);
            } else {
                leftSum += left[i];
                rightSum += right[i];
                if (leftMin > left[i]) {
                    leftMin = left[i];
                }
                if (rightMin > right[i]) {
                    rightMin = right[i];
                }
            }
        }
        return Math.min(leftSum-leftMin+1,rightSum-rightMin+1) + sum + 1;
    }
}